Source for file SC_UploadFile.php

Documentation is available at SC_UploadFile.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. $SC_UPLOADFILE_DIR = realpath(dirname( __FILE__));
  25. require_once($SC_UPLOADFILE_DIR . "/../module/gdthumb.php");
  26.  
  27. /* アップロードファイル管理クラス */
  28. class SC_UploadFile {
  29.     var $temp_dir;
  30.     var $save_dir;
  31.     var $keyname;    // ファイルinputタグのname
  32.     var $width;        // 横サイズ
  33.     var $height;    // 縦サイズ
  34.     var $arrExt;    // 指定する拡張子
  35.     var $temp_file;    // 保存されたファイル名
  36.     var $save_file; // DBから読み出したファイル名
  37.     var $disp_name;    // 項目名
  38.     var $size;        // 制限サイズ
  39.     var $necessary; // 必須の場合:true
  40.     var $image;        // 画像の場合:true
  41.  
  42.     // ファイル管理クラス
  43.     function SC_UploadFile($temp_dir, $save_dir) {
  44.         $this->temp_dir = (preg_match("|/$|", $temp_dir) == 0) ? $temp_dir. "/" : $temp_dir;
  45.         $this->save_dir = (preg_match("|/$|", $save_dir) == 0) ? $save_dir. "/" : $save_dir;
  46.         $this->file_max = 0;
  47.     }
  48.  
  49.     // ファイル情報追加
  50.     function addFile($disp_name, $keyname, $arrExt, $size, $necessary=false, $width=0, $height=0, $image=true) {
  51.         $this->disp_name[] = $disp_name;
  52.         $this->keyname[] = $keyname;
  53.         $this->width[] = $width;
  54.         $this->height[] = $height;
  55.         $this->arrExt[] = $arrExt;
  56.         $this->size[] = $size;
  57.         $this->necessary[] = $necessary;
  58.         $this->image[] = $image;
  59.     }
  60.     // サムネイル画像の作成
  61.     function makeThumb($src_file, $width, $height) {
  62.         // 一意なIDを取得する。
  63.         $uniqname = date("mdHi") . "_" . uniqid("");
  64.  
  65.         $dst_file = $this->temp_dir . $uniqname;
  66.  
  67.         $objThumb = new gdthumb();
  68.         $ret = $objThumb->Main($src_file, $width, $height, $dst_file);
  69.  
  70.         if($ret[0] != 1) {
  71.             // エラーメッセージの表示
  72.             print($ret[1]);
  73.             exit;
  74.         }
  75.  
  76.         return basename($ret[1]);
  77.     }
  78.  
  79.     // アップロードされたファイルを保存する。
  80.     // FIXME see. http://www.php.net/manual/en/features.file-upload.php
  81.     function makeTempFile($keyname, $rename = true) {
  82.         $objErr = new SC_CheckError();
  83.         $cnt = 0;
  84.         $arrKeyname = array_flip($this->keyname);
  85.  
  86.         if(!($_FILES[$keyname]['size'] > 0)) {
  87.             $objErr->arrErr[$keyname] = "※ " . $this->disp_name[$arrKeyname[$keyname]] . "がアップロードされていません。<br />";
  88.         } else {
  89.             foreach($this->keyname as $val) {
  90.                 // 一致したキーのファイルに情報を保存する。
  91.                 if ($val == $keyname) {
  92.                     // 拡張子チェック
  93.                     $objErr->doFunc(array($this->disp_name[$cnt], $keyname, $this->arrExt[$cnt]), array("FILE_EXT_CHECK"));
  94.                     // ファイルサイズチェック
  95.                     $objErr->doFunc(array($this->disp_name[$cnt], $keyname, $this->size[$cnt]), array("FILE_SIZE_CHECK"));
  96.                     // エラーがない場合
  97.                     if(!isset($objErr->arrErr[$keyname])) {
  98.                         // 画像ファイルの場合
  99.                         if($this->image[$cnt]) {
  100.                             $this->temp_file[$cnt] = $this->makeThumb($_FILES[$keyname]['tmp_name'], $this->width[$cnt], $this->height[$cnt]);
  101.                         // 画像ファイル以外の場合
  102.                         } else {
  103.                             // 一意なファイル名を作成する。
  104.                             if($rename) {
  105.                                 $uniqname = date("mdHi") . "_" . uniqid("").".";
  106.                                 $this->temp_file[$cnt] = ereg_replace("^.*\.",$uniqname, $_FILES[$keyname]['name']);
  107.                             } else {
  108.                                 $this->temp_file[$cnt] = $_FILES[$keyname]['name'];
  109.                             }
  110.                             $result  = copy($_FILES[$keyname]['tmp_name'], $this->temp_dir . $this->temp_file[$cnt]);
  111.                             GC_Utils_Ex::gfPrintLog($_FILES[$keyname]['name']." -> ". $this->temp_dir . $this->temp_file[$cnt]);
  112.                         }
  113.                     }
  114.                 }
  115.                 $cnt++;
  116.             }
  117.         }
  118.         return $objErr->arrErr[$keyname];
  119.     }
  120.  
  121.     // 画像を削除する。
  122.     function deleteFile($keyname) {
  123.         $objImage = new SC_Image($this->temp_dir);
  124.         $cnt = 0;
  125.         foreach($this->keyname as $val) {
  126.             if ($val == $keyname) {
  127.                 // 一時ファイルの場合削除する。
  128.                 if($this->temp_file[$cnt] != "") {
  129.                     $objImage->deleteImage($this->temp_file[$cnt], $this->temp_dir);
  130.                 }
  131.                 $this->temp_file[$cnt] = "";
  132.                 $this->save_file[$cnt] = "";
  133.             }
  134.             $cnt++;
  135.         }
  136.     }
  137.  
  138.     // 一時ファイルパスを取得する。
  139.     function getTempFilePath($keyname) {
  140.         $cnt = 0;
  141.         $filepath = "";
  142.         foreach($this->keyname as $val) {
  143.             if ($val == $keyname) {
  144.                 if($this->temp_file[$cnt] != "") {
  145.                     $filepath = $this->temp_dir . $this->temp_file[$cnt];
  146.                 }
  147.             }
  148.             $cnt++;
  149.         }
  150.         return $filepath;
  151.     }
  152.  
  153.     // 一時ファイルを保存ディレクトリに移す
  154.     function moveTempFile() {
  155.         $cnt = 0;
  156.         $objImage = new SC_Image($this->temp_dir);
  157.  
  158.         foreach($this->keyname as $val) {
  159.             if(isset($this->temp_file[$cnt]) && $this->temp_file[$cnt] != "") {
  160.  
  161.                 $objImage->moveTempImage($this->temp_file[$cnt], $this->save_dir);
  162.  
  163.                 // すでに保存ファイルがあった場合は削除する。
  164.                 if(isset($this->save_file[$cnt])
  165.                    && $this->save_file[$cnt] != ""
  166.                    && !ereg("^sub/", $this->save_file[$cnt])) {
  167.  
  168.                     $objImage->deleteImage($this->save_file[$cnt], $this->save_dir);
  169.                 }
  170.             }
  171.             $cnt++;
  172.         }
  173.     }
  174.  
  175.     // HIDDEN用のファイル名配列を返す
  176.     function getHiddenFileList() {
  177.         $cnt = 0;
  178.         $arrRet = array();
  179.         foreach($this->keyname as $val) {
  180.             if(isset($this->temp_file[$cnt]) && $this->temp_file[$cnt] != "") {
  181.                 $arrRet["temp_" . $val] = $this->temp_file[$cnt];
  182.             }
  183.             if(isset($this->save_file[$cnt]) && $this->save_file[$cnt] != "") {
  184.                 $arrRet["save_" . $val] = $this->save_file[$cnt];
  185.             }
  186.             $cnt++;
  187.         }
  188.         return $arrRet;
  189.     }
  190.  
  191.     // HIDDENで送られてきたファイル名を取得する
  192.     function setHiddenFileList($arrPOST) {
  193.         $cnt = 0;
  194.         foreach($this->keyname as $val) {
  195.             $key = "temp_" . $val;
  196.             if(isset($arrPOST[$key]) && !empty($arrPOST[$key])) {
  197.                 $this->temp_file[$cnt] = $arrPOST[$key];
  198.             }
  199.             $key = "save_" . $val;
  200.             if(isset($arrPOST[$key]) && !empty($arrPOST[$key])) {
  201.                 $this->save_file[$cnt] = $arrPOST[$key];
  202.             }
  203.             $cnt++;
  204.         }
  205.     }
  206.  
  207.     // フォームに渡す用のファイル情報配列を返す
  208.     function getFormFileList($temp_url, $save_url, $real_size = false) {
  209.         $arrRet = array();
  210.         $cnt = 0;
  211.         foreach($this->keyname as $val) {
  212.             if(isset($this->temp_file[$cnt]) && $this->temp_file[$cnt] != "") {
  213.                 // ファイルパスチェック(パスのスラッシュ/が連続しないようにする。)
  214.                 if(ereg("/$", $temp_url)) {
  215.                     $arrRet[$val]['filepath'] = $temp_url . $this->temp_file[$cnt];
  216.                 } else {
  217.                     $arrRet[$val]['filepath'] = $temp_url . "/" . $this->temp_file[$cnt];
  218.                 }
  219.                 $arrRet[$val]['real_filepath'] = $this->temp_dir . $this->temp_file[$cnt];
  220.             } elseif (isset($this->save_file[$cnt]) && $this->save_file[$cnt] != "") {
  221.                 // ファイルパスチェック(パスのスラッシュ/が連続しないようにする。)
  222.                 if(ereg("/$", $save_url)) {
  223.                     $arrRet[$val]['filepath'] = $save_url . $this->save_file[$cnt];
  224.                 } else {
  225.                     $arrRet[$val]['filepath'] = $save_url . "/" . $this->save_file[$cnt];
  226.                 }
  227.                 $arrRet[$val]['real_filepath'] = $this->save_dir . $this->save_file[$cnt];
  228.             }
  229.             if(isset($arrRet[$val]['filepath']) && !empty($arrRet[$val]['filepath'])) {
  230.                 if($real_size){
  231.                     if(is_file($arrRet[$val]['real_filepath'])) {
  232.                         list($width, $height) = getimagesize($arrRet[$val]['real_filepath']);
  233.                     }
  234.                     // ファイル横幅
  235.                     $arrRet[$val]['width'] = $width;
  236.                     // ファイル縦幅
  237.                     $arrRet[$val]['height'] = $height;
  238.                 }else{
  239.                     // ファイル横幅
  240.                     $arrRet[$val]['width'] = $this->width[$cnt];
  241.                     // ファイル縦幅
  242.                     $arrRet[$val]['height'] = $this->height[$cnt];
  243.                 }
  244.                 // 表示名
  245.                 $arrRet[$val]['disp_name'] = $this->disp_name[$cnt];
  246.             }
  247.             $cnt++;
  248.         }
  249.         return $arrRet;
  250.     }
  251.  
  252.     // DB保存用のファイル名配列を返す
  253.     function getDBFileList() {
  254.         $cnt = 0;
  255.         foreach($this->keyname as $val) {
  256.             if(isset($this->temp_file[$cnt]) && $this->temp_file[$cnt] != "") {
  257.                 $arrRet[$val] = $this->temp_file[$cnt];
  258.             } else  {
  259.                 $arrRet[$val] = isset($this->save_file[$cnt]) ? $this->save_file[$cnt] : "";
  260.             }
  261.             $cnt++;
  262.         }
  263.         return $arrRet;
  264.     }
  265.  
  266.     // DBで保存されたファイル名配列をセットする
  267.     function setDBFileList($arrVal) {
  268.         $cnt = 0;
  269.         foreach($this->keyname as $val) {
  270.             if(isset($arrVal[$val]) && $arrVal[$val] != "") {
  271.                 $this->save_file[$cnt] = $arrVal[$val];
  272.             }
  273.             $cnt++;
  274.         }
  275.     }
  276.  
  277.     // 画像をセットする
  278.     function setDBImageList($arrVal) {
  279.         $cnt = 0;
  280.         foreach($this->keyname as $val) {
  281.             if($arrVal[$val] != "" && $val == 'tv_products_image') {
  282.                 $this->save_file[$cnt] = $arrVal[$val];
  283.             }
  284.             $cnt++;
  285.         }
  286.     }
  287.  
  288.     // DB上のファイルの内削除要求があったファイルを削除する。
  289.     function deleteDBFile($arrVal) {
  290.         $objImage = new SC_Image($this->temp_dir);
  291.         $cnt = 0;
  292.         foreach($this->keyname as $val) {
  293.             if($arrVal[$val] != "") {
  294.                 if($this->save_file[$cnt] == "" && !ereg("^sub/", $arrVal[$val])) {
  295.                     $objImage->deleteImage($arrVal[$val], $this->save_dir);
  296.                 }
  297.             }
  298.             $cnt++;
  299.         }
  300.     }
  301.  
  302.     // 必須判定
  303.     function checkEXISTS($keyname = "") {
  304.         $cnt = 0;
  305.         $arrRet = array();
  306.         foreach($this->keyname as $val) {
  307.             if($val == $keyname || $keyname == "") {
  308.                 // 必須であればエラーチェック
  309.                 if ($this->necessary[$cnt] == true) {
  310.                     if (!isset($this->save_file[$cnt])) $this->save_file[$cnt] = "";
  311.                     if (!isset($this->temp_file[$cnt])) $this->temp_file[$cnt] = "";
  312.                     if($this->save_file[$cnt] == ""
  313.                             &&  $this->temp_file[$cnt] == "") {
  314.                         $arrRet[$val] = "※ " . $this->disp_name[$cnt] . "がアップロードされていません。<br>";
  315.                     }
  316.                 }
  317.             }
  318.             $cnt++;
  319.         }
  320.         return $arrRet;
  321.     }
  322.  
  323.     // 拡大率を指定して画像保存
  324.     function saveResizeImage($keyname, $to_w, $to_h) {
  325.         $path = "";
  326.  
  327.         // keynameの添付ファイルを取得
  328.         $arrImageKey = array_flip($this->keyname);
  329.         $file = $this->temp_file[$arrImageKey[$keyname]];
  330.         $filepath = $this->temp_dir . $file;
  331.  
  332.         $path = $this->makeThumb($filepath, $to_w, $to_h);
  333.  
  334.         // ファイル名だけ返す
  335.         return basename($path);
  336.     }
  337. }
  338. ?>

Documentation generated on Tue, 28 Apr 2009 18:13:43 +0900 by phpDocumentor 1.4.2